package com.yeskery.nut.extend.mcp.core.schema;

import java.util.List;
import java.util.Map;

/**
 * 工具规范
 * @author sprout
 * 2025-04-18 09:27
 */
public abstract class ToolSchema {

    /**
     * 列出工具
     */
    public static class ListToolsResult {
        /** 工具列表 */
        private List<Tool> tools;
        /** 下一页游标 */
        private String nextCursor;

        /**
         * 获取工具列表
         * @return 工具列表
         */
        public List<Tool> getTools() {
            return tools;
        }

        /**
         * 设置工具列表
         * @param tools 工具列表
         */
        public void setTools(List<Tool> tools) {
            this.tools = tools;
        }

        /**
         * 获取下一页游标
         * @return 下一页游标
         */
        public String getNextCursor() {
            return nextCursor;
        }

        /**
         * 设置下一页游标
         * @param nextCursor 下一页游标
         */
        public void setNextCursor(String nextCursor) {
            this.nextCursor = nextCursor;
        }
    }

    /**
     * 工具
     */
    public static class Tool {

        /** 工具名称 */
        private String name;

        /** 工具描述 */
        private String description;

        /** 工具输入参数 */
        private JsonSchema inputSchema;

        /**
         * 获取工具名称
         * @return 工具名称
         */
        public String getName() {
            return name;
        }

        /**
         * 设置工具名称
         * @param name 工具名称
         */
        public void setName(String name) {
            this.name = name;
        }

        /**
         * 获取工具描述
         * @return 工具描述
         */
        public String getDescription() {
            return description;
        }

        /**
         * 设置工具描述
         * @param description 工具描述
         */
        public void setDescription(String description) {
            this.description = description;
        }

        /**
         * 获取工具输入参数
         * @return 工具输入参数
         */
        public JsonSchema getInputSchema() {
            return inputSchema;
        }

        /**
         * 设置工具输入参数
         * @param inputSchema 工具输入参数
         */
        public void setInputSchema(JsonSchema inputSchema) {
            this.inputSchema = inputSchema;
        }
    }

    /**
     * JsonSchema
     */
    public static class JsonSchema {
        /** 类型 */
        private String type;

        /** 属性 */
        private Map<String, Property> properties;

        /** 必填字段 */
        private List<String> required;

        /** 是否允许其他属性 */
        private Boolean additionalProperties;

        /**
         * 获取类型
         * @return 类型
         */
        public String getType() {
            return type;
        }

        /**
         * 设置类型
         * @param type 类型
         */
        public void setType(String type) {
            this.type = type;
        }

        /**
         * 获取属性
         * @return 属性
         */
        public Map<String, Property> getProperties() {
            return properties;
        }

        /**
         * 设置属性
         * @param properties 属性
         */
        public void setProperties(Map<String, Property> properties) {
            this.properties = properties;
        }

        /**
         * 获取必填字段
         * @return 必填字段
         */
        public List<String> getRequired() {
            return required;
        }

        /**
         * 设置必填字段
         * @param required 必填字段
         */
        public void setRequired(List<String> required) {
            this.required = required;
        }

        /**
         * 获取是否允许其他属性
         * @return 是否允许其他属性
         */
        public Boolean getAdditionalProperties() {
            return additionalProperties;
        }

        /**
         * 设置是否允许其他属性
         * @param additionalProperties 是否允许其他属性
         */
        public void setAdditionalProperties(Boolean additionalProperties) {
            this.additionalProperties = additionalProperties;
        }
    }

    /**
     * 属性
     */
    public static class Property {
        /** 类型 */
        private String type;

        /** 描述 */
        private String description;

        /**
         * 获取类型
         * @return 类型
         */
        public String getType() {
            return type;
        }

        /**
         * 设置类型
         * @param type 类型
         */
        public void setType(String type) {
            this.type = type;
        }

        /**
         * 获取描述
         * @return 描述
         */
        public String getDescription() {
            return description;
        }

        /**
         * 设置描述
         * @param description 描述
         */
        public void setDescription(String description) {
            this.description = description;
        }
    }

    /**
     * 调用工具请求
     */
    public static class CallToolRequest {
        /** 工具名称 */
        private String name;
        /** 工具参数 */
        private Map<String, Object> arguments;

        /**
         * 获取工具名称
         * @return 工具名称
         */
        public String getName() {
            return name;
        }

        /**
         * 设置工具名称
         * @param name 工具名称
         */
        public void setName(String name) {
            this.name = name;
        }

        /**
         * 获取工具参数
         * @return 工具参数
         */
        public Map<String, Object> getArguments() {
            return arguments;
        }

        /**
         * 设置工具参数
         * @param arguments 工具参数
         */
        public void setArguments(Map<String, Object> arguments) {
            this.arguments = arguments;
        }
    }

    /**
     * 调用工具结果
     */
    public static class CallToolResult {
        /** 工具输出 */
        private List<ContentSchema.Content> content;

        /** 是否出错 */
        private Boolean isError;

        /**
         * 获取工具输出
         * @return 工具输出
         */
        public List<ContentSchema.Content> getContent() {
            return content;
        }

        /**
         * 设置工具输出
         * @param content 工具输出
         */
        public void setContent(List<ContentSchema.Content> content) {
            this.content = content;
        }

        /**
         * 获取是否出错
         * @return 是否出错
         */
        public Boolean getIsError() {
            return isError;
        }

        /**
         * 设置是否出错
         * @param error 是否出错
         */
        public void setIsError(Boolean error) {
            isError = error;
        }
    }
}
